package com.woniuxy.ai;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.woniuxy.tools.WoniuParamTool;
import com.woniuxy.tools.WoniuTool;
import com.woniuxy.utils.JavaType2JsonType;

import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

/**
 * @Author: 马宇航
 * @Todo: 基于注解构建工具类
 * @DateTime: 25/09/08/星期一 17:50
 * @Component: 成都蜗牛学苑
 **/
public class BuilderTools {
    public static String buildToolsJson(Object object){
        //获取所有方法，只有加了我们的自定义注解的方法，才需要拼接到JSON上
        Method[] methods = object.getClass().getMethods();
        ObjectNode tools = new ObjectMapper().createObjectNode();
        for (Method method : methods) {
            //有加注解的才需要拼接
            if(method.getAnnotation(WoniuTool.class)!=null){
                tools.put("type","function");
                ObjectNode function = new ObjectMapper().createObjectNode();
                //套娃
                tools.put("function",function);
                //有这个注解，我才继续往下拼接JSON
                //获取注解上的信息
                WoniuTool woniuTool = method.getAnnotation(WoniuTool.class);
                //方法上的 注解的名字，其实就是提交给AI的函数名，可以和代码中的函数名不一致（可以做个map映射就ok)
                // json中的函数名字name
                function.put("name",woniuTool.name());
                // json中的函数描述description
                function.put("description",woniuTool.description());
                //取出对应的函数的参数的注解
                if (method.getParameterAnnotations().length>0){
                    ObjectNode parametersJson = new ObjectMapper().createObjectNode();
                    function.put("parameters",parametersJson);
                    parametersJson.put("type","object");
                    ObjectNode properties = new ObjectMapper().createObjectNode();
                    parametersJson.put("properties",properties);
                    //有参数注解，有另外的方案,先取出所有的参数列表，会考虑参数名和参数类型的封装
                    Parameter[] parameters = method.getParameters();
                    for (Parameter parameter : parameters) {
                        //取出参数注解 判断是不是我们的参数
                        if (parameter.getAnnotation(WoniuParamTool.class)!=null){
                            //取出自定义的参数内容
                            WoniuParamTool paramTool = parameter.getAnnotation(WoniuParamTool.class);
                            //继续拼接
                            ObjectNode param = new ObjectMapper().createObjectNode();
                            properties.put(parameter.getName(),param);
                            //java类型转换成JSON的数据类型
                            param.put("type", JavaType2JsonType.convert(parameter.getType().getSimpleName()));
                            param.put("description",paramTool.description());
                        }
                    }
                }else {
                    //无参数注解，有无参数注解的用法
                }
            }
        }
        return tools.asText();
//        System.out.println(new ObjectMapper().valueToTree(tools));
    }
}
